<?php
if (! defined ( FLAG )){ trigger_error('Access error!', E_USER_ERROR); die; }
/**
 * Класс для вспомогательных методов
 * @author Sogimu
 *
 * 12.02.2012
 */
class TOOL {
	
	public static function myErrorHandler($errno, $errstr, $errfile, $errline){
		if (!(error_reporting() & $errno)) {
			// Этот код ошибки не включен в error_reporting
			return;
		}

		switch ($errno) {
		default:
			echo '<div style="background: #f4e4e4;">';
			echo "<b>Error:</b> [$errno] $errstr<br />\n";
			echo "  Ошибка в строке $errline файла $errfile";
			echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
			echo "Завершение работы...<br />\n";
			echo '</div>';
			exit(1);
			break;
		}

		/* Не запускаем внутренний обработчик ошибок PHP */
		return true;
	}

	public static function safeData($data, $patternSkip = NULL) {
		if ($patternSkip != NULL && strlen ( $patternSkip ) > 0)
		$selective = true;
		else
		$selective = false;
		if (is_array ( $data )) {
			reset ( $data );
			while ( list ( $key, $val ) = each ( $data ) ) {
				if (is_array ( $val ))
				$data [$key] = self::safeData ( $val );
				elseif (is_string ( $val )) {
					$proceed = true;
					if ($selective == true)
					if (preg_match ( $patternSkip, $key ))
					$proceed = false;
					if ($proceed) {
						$data [$key] = nl2br( htmlspecialchars ( $val ) );
						if (!get_magic_quotes_gpc())
							$data [$key] = addslashes ( $data [$key] );
					}
				}
			}
			reset($data);
		} else {
			$data = str_replace ( $str_match, $str_replace, htmlspecialchars ( $data ) );
			if (! get_magic_quotes_gpc ())
				$data = addslashes ( $data );
		}
		return $data;
	}
	
	/**
	* Получение списка файлов.
	* @param string $path Путь к папке
	* @param string $path Расширение файлов(а) !(задается с точкой ".php")!
	* @return string Массив имен файлов
	* Описание: Возвращает массив, где ключ это число, а значение это путь к файлу в заданной папке.
	*/
	public static function Load_files($path,$file_end){
		if(is_dir($path)){
			if($file_end[0]=='.'){
				$hdl = opendir ( $path );
				while ( $a = readdir ( $hdl ) ) {
					$fullAdr = $path. '/' . $a;
					if ($a != '.' && $a != '..' && is_file ( $fullAdr ) && strpos ( $a, $file_end ) !== false){	
						$tmp[] = $a;
					}	
				}
				closedir ( $hdl );
				return isset($tmp)?$tmp:array();
			} else {
				trigger_error('TOOL::Load_file: Bad file_end!', E_USER_ERROR);
			}
		} else {
			trigger_error('TOOL::Load_file: This dir is not!', E_USER_ERROR);
		}
	}
	
	/**
	* Получение списка файлов указаного расширения отсортированных "по заначимости". Значимость берется из названия файла, Пример "1.10[jCanvaScript.1.5.15.js" <- положительное число до "[" это значимость файла, чем меньше число, тем выше в списке окажется файл.  
	* @param string $path Путь к папке
	* @param string $path Расширение файлов !(задается с точкой ".php")!
	* @return string Массив ,отсортированых по значимости, полных путей к файлам находящихся в заданной папке
	* Описание: Возвращает массив, где ключ это число указывающие на значимость файла, а значение это полный путь к файлу. 
	*/
	public static function Load($path,$file_end){
		global $STR;
		$root = $STR->getVar(array('CONFIG','root'));
		$tmp = TOOL::Load_files($path,$file_end);
		if(isset($tmp) && $tmp != array()){
			$j=0;
			foreach($tmp as $i){
				$args = explode('[',$i);
				if (isset($args[1]) && $args[0]!=$args){
					if(is_numeric($args[0])) $data[$args[0]] = $i;
				} else {
					$data[$j++ + 999] = $i;
				}
			}
			//var_dump($data);
			ksort($data);
			foreach($data as $key => $value){
				$data[$key] = $root . '/' . $path . '/' . $value;
			}
		}
		return isset($data)?$data:array();
	}

	/**
	* Определение браузера из строки типа "http_user_agent"
	* @param string $agent Строка "http_user_agent"
	* @return string Название и версия бразуера
	*/
	public static function detectBrowser($agent) {
		$browsers = array ('netcaptor' => array ('name' => 'Netcaptor', 'rule' => 'netcaptor[ /]([0-9.]{1,10})' ), 'firefox' => array ('name' => 'Firefox', 'rule' => 'Firefox/([0-9.+]{1,10})' ), 'minefield' => array ('name' => 'Minefield (Firefox)', 'rule' => 'Minefield/([0-9.+]{1,10})' ), 'opera' => array ('name' => 'Opera', 'rule' => 'opera[ /]([0-9.]{1,10})' ), 'yandex' => array ('name' => 'Yandex Bot', 'rule' => 'Yandex[ /]([0-9.]{1,10})' ), 'aol' => array ('name' => 'AOL', 'rule' => 'aol[ /\-]([0-9.]{1,10})' ), 'aol2' => array ('name' => 'AOL', 'rule' => 'aol[ /\-]?browser' ), 'chrome' => array ('name' => 'Google Chrome', 'rule' => 'Chrome[ /]([0-9.]{1,10})' ), 'safari' => array ('name' => 'Safari', 'rule' => 'version/([0-9.]{1,10}) safari/' ), 'mosaic' => array ('name' => 'Mosaic', 'rule' => 'mosaic[ /]([0-9.]{1,10})' ), 'k-meleon' => array ('name' => 'K-Meleon', 'rule' => 'K-Meleon[ /]([0-9.]{1,10})' ), 'konqueror' => array ('name' => 'Konqueror', 'rule' => 'konqueror/([0-9.]{1,10})' ), 'avantbrowser' => array ('name' => 'Avant Browser', 'rule' => 'Avant[ ]?Browser' ), 'avantgo' => array ('name' => 'AvantGo', 'rule' => 'AvantGo[ /]([0-9.]{1,10})' ), 'proxomitron' => array ('name' => 'Proxomitron', 'rule' => 'Space[ ]?Bison/[0-9.]{1,10}' ), 'lynx' => array ('name' => 'Lynx', 'rule' => 'lynx/([0-9a-z.]{1,10})' ), 'links' => array ('name' => 'Links', 'rule' => 'Links[ /]\(([0-9.]{1,10})' ), 'galeon' => array ('name' => 'Galeon', 'rule' => 'galeon/([0-9.]{1,10})' ), 'abrowse' => array ('name' => 'ABrowse', 'rule' => 'abrowse/([0-9.]{1,10})' ), 'amaya' => array ('name' => 'Amaya', 'rule' => 'amaya/([0-9.]{1,10})' ), 'ant' => array ('name' => 'ANTFresco', 'rule' => 'ANTFresco[ /]([0-9.]{1,10})' ), 'aweb' => array ('name' => 'Aweb', 'rule' => 'Aweb[/ ]([0-9.]{1,10})' ), 'beonex' => array ('name' => 'Beonex', 'rule' => 'beonex/([0-9.]{1,10})' ), 'blazer' => array ('name' => 'Blazer', 'rule' => 'Blazer[/ ]([0-9.]{1,10})' ), 'camino' => array ('name' => 'Camino', 'rule' => 'camino/([0-9.+]{1,10})' ), 'chimera' => array ('name' => 'Chimera', 'rule' => 'chimera/([0-9.+]{1,10})' ), 'columbus' => array ('name' => 'Columbus', 'rule' => 'columbus[ /]([0-9.]{1,10})' ), 'crazybrowser' => array ('name' => 'Crazy Browser', 'rule' => 'Crazy Browser[ /]([0-9.]{1,10})' ), 'curl' => array ('name' => 'Curl', 'rule' => 'curl[ /]([0-9.]{1,10})' ), 'deepnet' => array ('name' => 'Deepnet Explorer', 'rule' => 'Deepnet Explorer[/ ]([0-9.]{1,10})' ), 'dillo' => array ('name' => 'Dillo', 'rule' => 'dillo/([0-9.]{1,10})' ), 'doris' => array ('name' => 'Doris', 'rule' => 'Doris/([0-9.]{1,10})' ), 'elinks' => array ('name' => 'ELinks', 'rule' => 'ELinks[ /][(]*([0-9.]{1,10})' ), 'epiphany' => array ('name' => 'Epiphany', 'rule' => 'Epiphany/([0-9.]{1,10})' ), 'firebird' => array ('name' => 'Firebird', 'rule' => 'Firebird/([0-9.+]{1,10})' ), 'ibrowse' => array ('name' => 'IBrowse', 'rule' => 'ibrowse[ /]([0-9.]{1,10})' ), 'icab' => array ('name' => 'iCab', 'rule' => 'icab[/ ]([0-9.]{1,10})' ), 'ice' => array ('name' => 'ICEbrowser', 'rule' => 'ICEbrowser/v?([0-9._]{1,10})' ), 'isilox' => array ('name' => 'iSiloX', 'rule' => 'iSilox/([0-9.]{1,10})' ), 'lotus' => array ('name' => 'Lotus Notes', 'rule' => 'Lotus[ -]?Notes[ /]([0-9.]{1,10})' ), 'lunascape' => array ('name' => 'Lunascape', 'rule' => 'Lunascape[ /]([0-9.]{1,10})' ), 'maxthon' => array ('name' => 'Maxthon', 'rule' => ' Maxthon[);]' ), 'mbrowser' => array ('name' => 'mBrowser', 'rule' => 'mBrowser[ /]([0-9.]{1,10})' ), 'multibrowser' => array ('name' => 'Multi-Browser', 'rule' => 'Multi-Browser[ /]([0-9.]{1,10})' ), 'nautilus' => array ('name' => 'Nautilus', 'rule' => '(gnome[ -]?vfs|nautilus)/([0-9.]{1,10})' ), 'netfront' => array ('name' => 'NetFront', 'rule' => 'NetFront[ /]([0-9.]{1,10})$' ), 'netpositive' => array ('name' => 'NetPositive', 'rule' => 'netpositive[ /]([0-9.]{1,10})' ), 'omniweb' => array ('name' => 'OmniWeb', 'rule' => 'omniweb/[ a-z]?([0-9.]{1,10})$' ), 'oregano' => array ('name' => 'Oregano', 'rule' => 'Oregano[0-9]?[ /]([0-9.]{1,10})$' ), 'phaseout' => array ('name' => 'PhaseOut', 'rule' => 'www.phaseout.net' ), 'plink' => array ('name' => 'PLink', 'rule' => 'PLink[ /]([0-9a-z.]{1,10})' ), 'phoenix' => array ('name' => 'Phoenix', 'rule' => 'Phoenix/([0-9.+]{1,10})' ), 'proxomitron' => array ('name' => 'Proxomitron', 'rule' => 'Space[ ]?Bison/[0-9.]{1,10}' ), 'shiira' => array ('name' => 'Shiira', 'rule' => 'Shiira/([0-9.]{1,10})' ), 'sleipnir' => array ('name' => 'Sleipnir', 'rule' => 'Sleipnir( Version)?[ /]([0-9.]{1,10})' ), 'slimbrowser' => array ('name' => 'SlimBrowser', 'rule' => 'Slimbrowser' ), 'staroffice' => array ('name' => 'StarOffice', 'rule' => 'staroffice[ /]([0-9.]{1,10})' ), 'sunrise' => array ('name' => 'Sunrise', 'rule' => 'SunriseBrowser[ /]([0-9.]{1,10})' ), 'voyager' => array ('name' => 'Voyager', 'rule' => 'voyager[ /]([0-9.]{1,10})' ), 'w3m' => array ('name' => 'w3m', 'rule' => 'w3m/([0-9.]{1,10})' ), 'webtv' => array ('name' => 'Webtv', 'rule' => 'webtv[ /]([0-9.]{1,10})' ), 'xiino' => array ('name' => 'Xiino', 'rule' => '^Xiino[ /]([0-9a-z.]{1,10})' ), 'explorer' => array ('name' => 'Internet Explorer', 'rule' => '\(compatible; MSIE[ /]([0-9.]{1,10})' ), 'netscape' => array ('name' => 'Netscape', 'rule' => 'netscape[0-9]?/([0-9.]{1,10})' ), 'netscape2' => array ('name' => 'Netscape', 'rule' => '^mozilla/([0-4]\.[0-9.]{1,10})' ), 'mozilla' => array ('name' => 'Mozilla', 'rule' => '^mozilla/[5-9]\.[0-9.]{1,10}.+rv:([0-9a-z.+]{1,10})' ), 'mozilla2' => array ('name' => 'Mozilla', 'rule' => '^mozilla/([5-9]\.[0-9a-z.]{1,10})' ) );
		$browser = '';
		foreach ( $browsers as $info ) {
			if (preg_match ( '#' . $info ['rule'] . '#i', $agent, $results ))
			return $info ['name'] . ' ' . $results [1];
		}
		return ($agent);
	}
	/**
	* Определение ОС пользователя из строки типа "http_user_agent"
	* @param unknown_type $agent Строка "http_user_agent"
	* @return string Названиеи версия ОС
	*/
	public static function detectOs($agent) {
		$os = array ('windows2003' => array ('name' => 'Windows 2003', 'rule' => 'wi(n|ndows)[ \-]?(2003|nt[ /]?5\.2)' ), 'windowsxp' => array ('name' => 'Windows XP', 'rule' => 'Windows XP' ), 'windowsxp2' => array ('name' => 'Windows XP', 'rule' => 'wi(n|ndows)[ \-]?nt[ /]?5\.1' ), 'windowsv' => array ('name' => 'Windows Vista', 'rule' => 'wi(n|ndows)[ \-]?nt[ /]?6\.0' ), 'windows7' => array ('name' => 'Windows 7', 'rule' => 'wi(n|ndows)[ \-]?nt[ /]?6\.1' ), 'windows2k' => array ('name' => 'Windows 2000', 'rule' => 'wi(n|ndows)[ \-]?(2000|nt[ /]?5\.0)' ), 'windows95' => array ('name' => 'Windows 95', 'rule' => 'wi(n|ndows)[ \-]?95' ), 'windowsce' => array ('name' => 'Windows CE', 'rule' => 'wi(n|ndows)[ \-]?ce' ), 'windowsme' => array ('name' => 'Windows ME', 'rule' => 'win 9x 4\.90' ), 'windowsme2' => array ('name' => 'Windows ME', 'rule' => 'wi(n|ndows)[ \-]?me' ), 'windowsnt' => array ('name' => 'Windows NT', 'rule' => 'wi(n|ndows)[ \-]?nt[ /]?([0-4][0-9.]{1,10})' ), 'windowsnt2' => array ('name' => 'Windows NT', 'rule' => 'wi(n|ndows)[ \-]?nt' ), 'windows98' => array ('name' => 'Windows 98', 'rule' => 'wi(n|ndows)[ \-]?98' ), 'windows' => array ('name' => 'Windows', 'rule' => 'wi(n|n32|ndows)' ), 'linux' => array ('name' => 'Linux', 'rule' => 'mdk for ([0-9.]{1,10})' ), 'linux2' => array ('name' => 'Linux', 'rule' => 'linux[ /\-]([a-z0-9.]{1,10})' ), 'linux3' => array ('name' => 'Linux', 'rule' => 'linux' ), 'macosx' => array ('name' => 'MacOS X', 'rule' => 'Mac[ ]?OS[ ]?X' ), 'macppc' => array ('name' => 'MacOS PPC', 'rule' => 'Mac(_Power|intosh.+P)PC' ), 'mac' => array ('name' => 'MacOS', 'rule' => 'mac[^hk]' ), 'amiga' => array ('name' => 'Amiga', 'rule' => 'Amiga[ ]?OS[ /]([0-9.]{1,10})' ), 'beos' => array ('name' => 'BeOS', 'rule' => 'beos[ a-z]*([0-9.]{1,10})' ), 'freebsd' => array ('name' => 'FreeBSD', 'rule' => 'free[ \-]?bsd[ /]([a-z0-9.]{1,10})' ), 'freebsd2' => array ('name' => 'FreeBSD', 'rule' => 'free[ \-]?bsd' ), 'irix' => array ('name' => 'Irix', 'rule' => 'irix[0-9]*[ /]([0-9.]{1,10})' ), 'netbsd' => array ('name' => 'NetBSD', 'rule' => 'net[ \-]?bsd[ /]([a-z0-9.]{1,10})' ), 'netbsd2' => array ('name' => 'NetBSD', 'rule' => 'net[ \-]?bsd' ), 'os2' => array ('name' => 'OS/2 Warp', 'rule' => 'warp[ /]?([0-9.]{1,10})' ), 'os22' => array ('name' => 'OS/2 Warp', 'rule' => 'os[ /]?2' ), 'openbsd' => array ('name' => 'OpenBSD', 'rule' => 'open[ \-]?bsd[ /]([a-z0-9.]{1,10})' ), 'openbsd2' => array ('name' => 'OpenBSD', 'rule' => 'open[ \-]?bsd' ), 'palm' => array ('name' => 'PalmOS', 'rule' => 'Palm[ \-]?(Source|OS)[ /]?([0-9.]{1,10})' ), 'palm2' => array ('name' => 'PalmOS', 'rule' => 'Palm[ \-]?(Source|OS)' ) );
		foreach ( $os as $key => $info ) {
			if (preg_match ( '#' . $info ['rule'] . '#i', $agent, $results )) {
				if (strstr ( $key, 'win' ))
				return $info ['name'];
				else
				return $info ['name'] . ' ' . $results [1];
			}
		}
		return '';
	}
};
?>